カラフルボックスでのNext.jsアプリのnproc問題をReactで解決した話

こんにちは!今回は、私がレンタルサーバーのカラフルボックスでNext.jsアプリケーションを運用しようとした際に直面した「nproc占有問題」と、その解決策としてReact(Create React Appなど)ベースのアプリケーションに切り替えた経緯についてお話しします。

きっかけ:レンタルサーバーでのNext.jsアプリ運用

手軽にWebアプリケーションを公開したいと考え、使い慣れたカラフルボックスでNext.jsアプリを動かそうとしました。Next.jsはそのままだとNode.jsサーバーとして動作するため、カラフルボックスのNode.js環境を利用してデプロイを試みました。

発生した問題:nprocが占有され、アプリが停止する

デプロイ自体は成功し、最初は問題なく動作しているように見えました。しかし、しばらくするとアプリケーションにアクセスできなくなる現象が発生。サーバーの管理画面でリソース状況を確認すると、**nproc(ユーザーが起動できるプロセス数の上限)**が上限に達し、新たなプロセスを起動できなくなっていたのです。

Next.jsはビルド時やリクエスト処理時に内部で多くのプロセスを生成することがあり、特に共有レンタルサーバーのようなリソースに制限がある環境では、このnproc制限に抵触しやすいようです。一度占有されたnprocはなかなか解放されず、アプリケーションが実質的に停止してしまう状態でした。

解決策:Next.jsからReact(SPA)への移行

この問題を解決するために、いくつかのアプローチを検討しました。

  1. Next.jsの設定調整: プロセス数を抑えるような設定がないか探しましたが、根本的な解決には至りませんでした。
  2. サーバープランの変更: より上位のプランに変更すればnprocの上限も上がるかもしれませんが、コスト増は避けたいところです。
  3. アプリケーション構成の見直し: ここで、Next.jsのSSR(サーバーサイドレンダリング)やSSG(静的サイトジェネレーション)の恩恵が必須ではない小規模なアプリケーションであったため、クライアントサイドレンダリング(CSR)中心のReactアプリケーション(例: Create React Appで作成するようなSPA)への移行を考えました。

最終的に、**Reactのみの静的なシングルページアプリケーション(SPA)**としてビルドし、それを静的ファイルとしてホスティングする形に変更することにしました。

参考にした情報と具体的な設置手順

Reactアプリのビルドとレンタルサーバーへの設置にあたっては、以下の記事を参考にさせていただきました。非常に分かりやすく、スムーズに作業を進めることができました。

この記事で解説されているように、基本的な手順は以下の通りです。

  1. Reactプロジェクトのビルド: ローカル環境でReactプロジェクトのルートディレクトリで以下のコマンドを実行し、配信用ファイル一式を生成します。npm run buildこれにより、build (または dist) フォルダが作成されます。
  2. サーバーへのアップロード: 生成された build フォルダの中身全て(index.htmlstaticフォルダなど)を、レンタルサーバーの公開したいディレクトリ(例: public_html/react-app/など)にFTPクライアントなどを使ってアップロードします。
  3. .htaccessによるルーティング設定: SPAの場合、ブラウザのURL直接アクセス時やリロード時にも index.html を表示させ、React Routerなどのクライアントサイドルーティングが正しく機能するように設定する必要があります。 アップロードしたディレクトリのルート(上記例では public_html/react-app/)に、以下の内容で .htaccess ファイルを作成・設置します。
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase / # サブディレクトリに設置した場合は、そのパスに変更 (例: /react-app/)
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-l
  RewriteRule . /index.html [L] # サブディレクトリに設置した場合は、そのパスに変更 (例: /react-app/index.html)
</IfModule>

注意点:

RewriteBaseRewriteRule の最後の行のパスは、アプリケーションを設置するディレクトリに合わせて適宜変更してください。例えば、https://example.com/my-react-app/ でアクセスさせたい場合は、RewriteBase /my-react-app/RewriteRule . /my-react-app/index.html [L] のようになります。ドキュメントルート直下に設置する場合は、提示された内容のままで問題ありません。

結果:nproc問題の解消!

ReactのSPAとしてビルドした静的ファイルをレンタルサーバーにアップロードした結果、nprocが不必要に占有される問題は完全に解消されました。 アプリケーションも安定して動作するようになり、一安心です。

Next.jsは非常に強力で多機能なフレームワークですが、その特性上、サーバーリソース(特にプロセス数)をある程度消費する傾向があります。共有レンタルサーバーのようなリソース制限がシビアな環境では、今回のような問題が発生する可能性があることを学びました。

まとめと考察

今回の経験から、以下の点を学びました。

  • Next.js(特にSSRや動的な処理が多い場合)は、共有レンタルサーバーのリソース制限(特にnproc)と相性が悪い場合がある。
  • アプリケーションの要件によっては、Next.jsの代わりにReact(SPA)を選択し、静的ホスティングする方が安定運用に繋がるケースがある。
  • レンタルサーバーでNode.jsアプリケーションを運用する際は、nprocのようなリソース制限に注意が必要。

もちろん、Next.jsの静的エクスポート機能(next export)を利用して完全に静的なサイトを生成する方法もあるようですが、私はReact側に振り切る選択をしました。

同じような問題に直面している方の参考になれば幸いです。

これからはじめるReact実践入門 コンポーネントの基本からNext.jsによるアプリ開発まで

モダンJavaScriptの基本から始める React実践の教科書 (最新ReactHooks対応) (Informatics&IDEA)